/****************************************************************************
 ****************************************************************************
 ***
 ***   This header was created to make information necessary for userspace
 ***   to call into the Windows kernel available to Dr. Memory.  It contains
 ***   only constants, structures, and macros, and thus, contains no
 ***   copyrightable information.
 ***
 ****************************************************************************
 ****************************************************************************/

NTSTATUS NTAPI
NtWow64CallFunction64(__in ULONG FunctionIndex, __in ULONG Flags, __in ULONG InputLength,
                      __in_bcount(InputLength) PVOID InputBuffer, __in ULONG OutputLength,
                      __out_bcount(OutputLength) PVOID OutputBuffer,
                      __out_opt PULONG ReturnStatus);

PVOID NTAPI
NtWow64CsrAllocateCaptureBuffer(__in ULONG Count, __in ULONG Size);

ULONG NTAPI
NtWow64CsrAllocateMessagePointer(__inout PVOID CaptureBuffer, __in ULONG Length,
                                 __out PVOID *CapturedBuffer);

VOID NTAPI
NtWow64CsrCaptureMessageBuffer(__inout PVOID CaptureBuffer, __in_opt PVOID Buffer,
                               __in ULONG Length, __out PVOID *CapturedBuffer);

VOID NTAPI
NtWow64CsrCaptureMessageString(__inout PVOID CaptureBuffer, __in_opt PCSTR String,
                               __in ULONG Length, __in ULONG MaximumLength,
                               __out PSTRING CapturedString);

NTSTATUS NTAPI
NtWow64CsrClientCallServer(__inout PVOID ApiMessage, __inout_opt PVOID CaptureBuffer,
                           __in ULONG ApiNumber, __in ULONG ArgLength);

NTSTATUS NTAPI
NtWow64CsrClientConnectToServer(__in PWSTR ObjectDirectory, __in ULONG ServerDllIndex,
                                __in_opt PCSR_CALLBACK_INFO CallbackInformation,
                                __in PVOID ConnectionInformation,
                                __inout_opt PULONG ConnectionInformationLength,
                                __out_opt PBOOLEAN CalledFromServer);

NTSTATUS NTAPI
NtWow64CsrFreeCaptureBuffer(__in PVOID CaptureBuffer);

DWORD NTAPI NtWow64CsrGetProcessId(VOID);

NTSTATUS NTAPI NtWow64CsrIdentifyAlertableThread(VOID);

NTSTATUS NTAPI NtWow64CsrNewThread(VOID);

NTSTATUS NTAPI
NtWow64CsrSetPriorityClass(__in HANDLE ProcessHandle, __inout PULONG PriorityClass);

NTSTATUS NTAPI
NtWow64CsrVerifyRegion(__in PVOID Buffer, __in ULONG Length);

NTSTATUS NTAPI
NtWow64DebuggerCall(__in ULONG ServiceClass, __in ULONG Arg1, __in ULONG Arg2,
                    __in ULONG Arg3, __in ULONG Arg4);

NTSTATUS NTAPI
NtWow64GetCurrentProcessorNumberEx(__out PPROCESSOR_NUMBER ProcNumber);

NTSTATUS NTAPI
NtWow64GetNativeSystemInformation(__in SYSTEM_INFORMATION_CLASS SystemInformationClass,
                                  __out PVOID SystemInformation,
                                  __in ULONG SystemInformationLength,
                                  __out_opt PULONG ReturnLength);

NTSTATUS NTAPI
NtWow64InterlockedPopEntrySList(__inout PSLIST_HEADER ListHead);

NTSTATUS NTAPI
NtWow64QueryInformationProcess64(__in HANDLE ProcessHandle,
                                 __in PROCESSINFOCLASS ProcessInformationClass,
                                 __out_bcount(ProcessInformationLength)
                                     PVOID ProcessInformation64,
                                 __in ULONG ProcessInformationLength,
                                 __out_opt PULONG ReturnLength);

/* PVOID64 and ULONGLONG take 2 params each */
NTSTATUS NTAPI
NtWow64ReadVirtualMemory64(__in HANDLE ProcessHandle, __in_opt PVOID64 BaseAddress,
                           __out_bcount(BufferSize) PVOID Buffer,
                           __in ULONGULONG BufferSize,
                           __out_opt PULONGLONG NumberOfBytesRead);

NTSTATUS NTAPI
NtWow64WriteVirtualMemory64(__in HANDLE ProcessHandle, __in_opt PVOID64 BaseAddress,
                            __in_bcount(BufferSize) PVOID Buffer,
                            __in ULONGLONG BufferSize,
                            __out_opt PULONGLONG NumberOfBytesWritten);
